#include <iostream>
#include <queue>

using namespace std;

typedef long long LL;

const int N = 1e5 + 10;

//思路：
//先把 a[i] + b[1] 的所有值计算出来，放进小根堆中
//然后拿出堆顶元素，把下一个和计算出来，再放入堆中

int n;
int a[N], b[N];

struct node
{
	LL sum;
	int num1, num2;//a 和 b 的编号

	bool operator<(const node& t) const
	{
		//小根堆，大元素下坠
		return sum > t.sum;
	}
};

priority_queue<node> heap; // 小根堆

int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	for(int i = 1; i <= n; i++) cin >> b[i];	

	//1.将 a[i] + b[1] 放进堆里面
	for(int i = 1; i <= n; i++)
	{
		heap.push({a[i] + b[1], i, 1});
	}

	//2.依次取出堆顶的元素
	while(n--)
	{
		auto t = heap.top(); heap.pop();
		int num1 = t.num1, num2 = t.num2;
		cout << t.sum << " ";

		if(num2 + 1 <= n) heap.push({a[num1] + b[num2 + 1], num1, num2 + 1});
	}

	return 0;
}


